#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = ""
__author__ = "Administrator"
__mtime__ = "2016/6/17"
"""
'''

采用面向对象的程序设计思想，我们首先思考的就不是程序执行的流程，

而是Student这种数据类型应该被视为一个对象，

这个对象拥有Name和Score这两个属性（property）。

如果要打印一个学生的成绩，首先要创建出这个学生对应的对象，

然后给对象发送一个print_score消息，让对象把自己的数据打印出来。

'''


class Student(object):
    def __init__(self, name, score):
        self.Name = name
        self.Score = score

    def print_score(self):
        print '%s , %s' % (self.Name, self.Score)


'''

给对象发消息实际上就是调用对象对应的关联函数，称之为对象的方法（method）。

'''
tom = Student('Tom', 89)
tom.age = 8
jim = Student('Jim', 90)

tom.print_score()
print tom.age
jim.print_score()

'''
输出结果：
Tom , 89
8
Jim , 90
'''

'''

类是抽象的模板，比如Student类，

而实例是根据类创建出来的一个个具体的"对象"，

每个对象都拥有相同的方法，但各自的数据可能不同。

'''

'''

__init__方法的第一个参数永远是self，表示创建实例本身，

因此，在__init__方法内部，就可以把各种属性绑定到self，因为self就指向创建的实例本身。

有了__init__方法，在创建实例的时候就不能传入空的参数了，必须传入与__init__方法匹配的参数，

但self不需要传，Python解释器自己会吧实例变量传进去。

'''

'''

我们从外部看Student类，就只需要知道，创建实例时（实例化时）需要给出Name和Score，

而如何打印，都是在Student类的内部定义的，这些数据和逻辑被"封装"起来了，调用很容易，但却不用知道内部实现的细节。

封装的另一个好处是可以给Student类增加新的方法，比如get_grade.
'''

class Student(object):

    def __init__(self, name, score):
        self.Name = name
        self.Score = score

    def print_score(self):
        print '%s , %s' % (self.Name, self.Score)

    def get_grade(self):
        if self.Score >=90:
          print 'A'
        elif self.Score >=60:
          print 'B'
        else:
          print 'C'

tom = Student('Tom', 89)
tom.get_grade()
'''
输出结果：
B
'''
